home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / delphi / kolekce / d6 / rxlibsetup.exe / {app} / units / DBSECUR.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-02-19  |  5.0 KB  |  171 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 2001,2002 SGB Software          }
  6. {         Copyright (c) 1997, 1998 Fedor Koshevnikov,   }
  7. {                        Igor Pavluk and Serge Korolev  }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit DBSecur;
  12.  
  13. interface
  14.  
  15. {$I RX.INC}
  16.  
  17. uses SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  18.   Messages, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables,
  19.   RxLogin, LoginDlg, ChPswDlg;
  20.  
  21. type
  22.   TCheckUserEvent = function(UsersTable: TTable;
  23.     const Password: string): Boolean of object;
  24.  
  25. { TDBSecurity }
  26.  
  27.   TDBSecurity = class(TRxCustomLogin)
  28.   private
  29.     FDatabase: TDatabase;
  30.     FUsersTableName: TFileName;
  31.     FLoginNameField: String;
  32.     FSelectAlias: Boolean;
  33.     FOnCheckUser: TCheckUserEvent;
  34.     FOnChangePassword: TChangePasswordEvent;
  35.     procedure SetDatabase(Value: TDatabase);
  36.     procedure SetUsersTableName(const Value: TFileName);
  37.     function GetLoginNameField: string;
  38.     procedure SetLoginNameField(const Value: string);
  39.   protected
  40.     function DoCheckUser(UsersTable: TTable; const UserName,
  41.       Password: string): Boolean; dynamic;
  42.     function DoLogin(var UserName: string): Boolean; override;
  43.     procedure Loaded; override;
  44.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  45.   public
  46.     constructor Create(AOwner: TComponent); override;
  47.     destructor Destroy; override;
  48.     function ChangePassword: Boolean;
  49.   published
  50.     property Database: TDatabase read FDatabase write SetDatabase;
  51.     property LoginNameField: string read GetLoginNameField write SetLoginNameField;
  52.     property SelectAlias: Boolean read FSelectAlias write FSelectAlias default False;
  53.     property UsersTableName: TFileName read FUsersTableName write SetUsersTableName;
  54.     property Active;
  55.     property AllowEmptyPassword;
  56.     property AttemptNumber;
  57.     property IniFileName;
  58.     property MaxPasswordLen;
  59.     property UpdateCaption;
  60. {$IFDEF WIN32}
  61.     property UseRegistry;
  62. {$ENDIF}
  63.     property OnCheckUser: TCheckUserEvent read FOnCheckUser write FOnCheckUser;
  64.     property OnChangePassword: TChangePasswordEvent read FOnChangePassword
  65.       write FOnChangePassword;
  66.     property AfterLogin;
  67.     property BeforeLogin;
  68.     property OnUnlock;
  69.     property OnUnlockApp;
  70.     property OnIconDblClick;
  71.   end;
  72.  
  73. implementation
  74.  
  75. uses AppUtils, VCLUtils;
  76.  
  77. { TDBSecurity }
  78.  
  79. constructor TDBSecurity.Create(AOwner: TComponent);
  80. begin
  81.   inherited Create(AOwner);
  82.   FSelectAlias := False;
  83.   FLoginNameField := EmptyStr;
  84. end;
  85.  
  86. destructor TDBSecurity.Destroy;
  87. begin
  88.   //DisposeStr(FLoginNameField);
  89.   inherited Destroy;
  90. end;
  91.  
  92. procedure TDBSecurity.Notification(AComponent: TComponent; Operation: TOperation);
  93. begin
  94.   inherited Notification(AComponent, Operation);
  95.   if (Operation = opRemove) and (AComponent = Database) then Database := nil;
  96. end;
  97.  
  98. procedure TDBSecurity.Loaded;
  99. begin
  100.   inherited Loaded;
  101.   if not (csDesigning in ComponentState) and Active and
  102.     (Database <> nil) then
  103.   begin
  104.     Database.LoginPrompt := True;
  105.     if not Login then begin
  106.       TerminateApplication;
  107.     end;
  108.   end;
  109. end;
  110.  
  111. procedure TDBSecurity.SetDatabase(Value: TDatabase);
  112. begin
  113.   if FDatabase <> Value then begin
  114.     FDatabase := Value;
  115. {$IFDEF WIN32}
  116.     if Value <> nil then Value.FreeNotification(Self);
  117. {$ENDIF}
  118.   end;
  119. end;
  120.  
  121. procedure TDBSecurity.SetUsersTableName(const Value: TFileName);
  122. begin
  123.   if FUsersTableName <> Value then FUsersTableName := Value;
  124. end;
  125.  
  126. function TDBSecurity.GetLoginNameField: string;
  127. begin
  128.   Result := FLoginNameField;
  129. end;
  130.  
  131. procedure TDBSecurity.SetLoginNameField(const Value: string);
  132. begin
  133.   FLoginNameField := Value;
  134. end;
  135.  
  136. function TDBSecurity.DoCheckUser(UsersTable: TTable; const UserName,
  137.   Password: string): Boolean;
  138. var
  139.   SaveLoggedUser: string;
  140. begin
  141.   if Assigned(FOnCheckUser) then begin
  142.     SaveLoggedUser := LoggedUser;
  143.     try
  144.       SetLoggedUser(UserName);
  145.       Result := FOnCheckUser(UsersTable, Password);
  146.     finally
  147.       SetLoggedUser(SaveLoggedUser);
  148.     end;
  149.   end
  150.   else Result := True;
  151. end;
  152.  
  153. function TDBSecurity.DoLogin(var UserName: string): Boolean;
  154. var
  155.   IconClick: TNotifyEvent;
  156. begin
  157.   IconClick := OnIconDblClick;
  158.   if Assigned(IconClick) then IconClick := DoIconDblClick;
  159.   Result := LoginDialog(Database, AttemptNumber, UsersTableName,
  160.     LoginNameField, MaxPasswordLen, DoCheckUser, IconClick, UserName,
  161.     IniFileName, UseRegistry, SelectAlias);
  162. end;
  163.  
  164. function TDBSecurity.ChangePassword: Boolean;
  165. begin
  166.   Result := ChangePasswordDialog(Database, AttemptNumber, UsersTableName,
  167.     LoginNameField, LoggedUser, MaxPasswordLen, AllowEmptyPassword,
  168.     FOnChangePassword);
  169. end;
  170.  
  171. end.